package com.uade.webservices.logisticaMonitoreo;

import java.io.IOException;
import java.io.StringReader;
import java.rmi.RemoteException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.rpc.ServiceException;

import org.apache.log4j.Logger;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import com.uade.model.Configuracion;
import com.uade.model.Modelo;
import com.uade.model.Respuesta;
import com.uade.model.exceptions.LogisticaMonitoreoException;
import com.uade.xml.RespuestaHandler;


/**
 * Implementacion de la comunicacion con logistica y monitoreo  log
 * @author Francisco
 *
 */
public class LogWSImpl extends LogSenderStrategy {

	private Logger log = Logger.getLogger(LogWSImpl.class);

	public LogWSImpl() {
		super();
	}

	public LogWSImpl(Configuracion conf) {
		this.configuracion = conf;
	}

	@Override
	public void enviarLog(String xml) throws LogisticaMonitoreoException {

		log.debug("***********************");
		log.debug("Create Web Service Client...");

		try {
			LogisticaMonitoreoBeanServiceLocator locator = new LogisticaMonitoreoBeanServiceLocator();
			locator.setLogisticaMonitoreoWSPortEndpointAddress(configuracion
					.getIp() + "/LogisticaMonitoreo/LogisticaMonitoreoWS?wsdl");

			log.debug("Create Web Service...");
			LogisticaMonitoreoWS port = locator.getLogisticaMonitoreoWSPort();

			log.debug("Call Web Service Operation...");
			String respuesta = port.informarLog(xml);

			Respuesta resultado = procesarRespuesta(respuesta);

			if (!resultado.getEstado().equals(Modelo.OK.toString())) {
				log.error("No se pudo finalizar el proceso de compra: "
						+ resultado.getEstado() + " " + resultado.getMensaje());
				throw new LogisticaMonitoreoException(
						"No se pudo finalizar el proceso de compra: "
								+ resultado.getEstado() + " "
								+ resultado.getMensaje());
			}
			log.info("Server said ESTADO: " + resultado.getEstado());
			log.info("Server said MENSAJE: " + resultado.getMensaje());
			log.debug("***********************");
			log.debug("Call Over!");
		} catch (ServiceException e) {
			log.error(e.getMessage());
			log.error("Error en la comunicacion a logistica y monitoreo: "
					+ configuracion.getIp());
			throw new LogisticaMonitoreoException("No se pudo realizar la comunicacion con Logistica y monitoreo");
		} catch (RemoteException e) {
			log.error(e.getMessage());
			log.error("Error en la comunicacion a logistica y monitoreo: "
					+ configuracion.getIp());
			throw new LogisticaMonitoreoException("No se pudo realizar la comunicacion con Logistica y monitoreo");
		}
	}

	private Respuesta procesarRespuesta(String respuesta)
			throws LogisticaMonitoreoException {
		RespuestaHandler handler = new RespuestaHandler();

		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser saxParser;
		try {
			saxParser = factory.newSAXParser();

			InputSource is = new InputSource();
			is.setCharacterStream(new StringReader(respuesta));
			saxParser.parse(is, handler);

		} catch (ParserConfigurationException e) {
			log.error("Error al parsear el archivo de respuesta"
					+ e.getMessage());
			throw new LogisticaMonitoreoException(
					"Excepcion al parsear la repsuesta");
		} catch (SAXException e) {
			log.error("Error al parsear el archivo de respuesta"
					+ e.getMessage());
			throw new LogisticaMonitoreoException(
					"Excepcion al parsear la repsuesta");
		} catch (IOException e) {
			log.error("Error al parsear el archivo de respuesta:"
					+ e.getMessage());
			throw new LogisticaMonitoreoException(
					"Excepcion al parsear la respuesta");
		}
		return handler.getRespuesta();
	}

}
